www.gusucode.com > 一个美化窗口实例 VC++漂亮界面源码程序 > 一个美化窗口实例 VC++漂亮界面/其它可以引用的类源码/VC++菜单类的演示/QRSOnLead.cpp

    // QRSOnLead.cpp: implementation of the CQRSOnLead class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "QRSOnLead.h"
#include <math.h>
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CQRSOnLead::CQRSOnLead()
{

}

CQRSOnLead::~CQRSOnLead()
{

}
int CQRSOnLead::Border(int x, int length)
{
		if(x<0)x=-x;
	if(x>length)x=length*2-x-2;
	return(x);
}

void CQRSOnLead::Wavelet_Trans(double *wavelet_cof,double *clean_data)
{
		int i,j,k;	
 	double h[4]={0.125,0.375,0.375,0.125};//小波变换用到的系数 
	double g[2]={-2.0,2.0};				//小波变换用到的系数
	double c1[5]={1.5,1.12,1.03,1.01,1.00};//小波变换用到的系数
	double c2;							//小波变换用到的系数中间变量	
	int m;                              //控制步长	
	double low[SCALE][SAMPLE_RATE*LENGTH];					//信号小波变换后0-5层低频系数
	double temp1,temp2;					//计算低频高频系数时用到的临时变量	
	double high[SCALE][SAMPLE_RATE*LENGTH];					//信号小波变换后第0-6层高频系数

	for(i=0;i<SAMPLE_RATE*LENGTH;i++)
		high[0][i]=low[0][i]=clean_data[i];  //对第一层赋值

	m=1;
	for(k=1;k<SCALE;k++)                              //k 为层数
	{
		c2=1/c1[k-1];
 		     for(i=0;i<SAMPLE_RATE*LENGTH;i++)                         //i为节点数
			 {
			      temp1=0;
			      temp2=0;         
     		      for(j=-1;j<=2;j++)                        //j为滤波器系数  
			           temp1=temp1+h[j+1]*(*(low[k-1]+Border(i-m*j,SAMPLE_RATE*LENGTH)));
			      low[k][i]=temp1;
			}	
 		     for(i=0;i<SAMPLE_RATE*LENGTH;i++)                         //i为节点数
			 {
			      temp1=0;
			      temp2=0;         
     		      for(j=-1;j<=2;j++)                        //j为滤波器系数  
			           temp1=temp1+h[j+1]*(*(low[k-1]+Border(i-m*j,SAMPLE_RATE*LENGTH)));
			      for(j=0;j<=1;j++)
			           temp2=temp2+g[j]*(*(low[k-1]+Border(i-m*j,SAMPLE_RATE*LENGTH)));
			      high[k][i]=(c2*temp2);
			      low[k][i]=temp1;
			}
		
		m=2*m;
	}
    //对延迟时间进行补偿: 2的N次幂-1
	for(j=1;j<SCALE;j++)
	{
		for(i=0;i<SAMPLE_RATE*LENGTH-pow(2,j-1)+1;i++)
			high[j][i]=high[j][i+(int)(pow(2,j-1)-1)];
	}
	for(i=0;i<SAMPLE_RATE*LENGTH;i++)
		wavelet_cof[i]=high[2][i];
}

	void CQRSOnLead::Move_Window(double* Square_Data,double* Move_Data)
	{
		int i,j;
	for(i=WINDOW_WIDTH-1;i<SAMPLE_RATE*LENGTH;i++)
	{
		Move_Data[i]=0;
		for(j=0;j<WINDOW_WIDTH;j++)
			Move_Data[i]+=Square_Data[i-j];
		Move_Data[i]/=WINDOW_WIDTH;
	}
	for(i=0;i<WINDOW_WIDTH-1;i++)
		Move_Data[i]=0;
	}
	double CQRSOnLead::low_pass(double x)
	{
			static double in[3],out[2];
	double sum,sum1,sum2;
	double a[3]={1.0000,-1.2796,0.4776};
	double b[3]={0.0495,0.0990,0.0495};
	in[0]=in[1];
	in[1]=in[2];
	in[2]=x;
	sum1=b[0]*in[2]+b[1]*in[1]+b[2]*in[0];
	sum2=a[1]*out[1]+a[2]*out[0];
	sum=(sum1-sum2)/a[0];
	out[0]=out[1];
	out[1]=sum;
	return sum;
}

double CQRSOnLead::high_pass(double x)
{
	double sum1,sum;
	static double in[2],out;
   	 in[0]=in[1];
	in[1]=x;
	sum1=in[1]-in[0]+0.9895*out;
	sum=sum1/1.0105;
	out=sum;
	return sum;
}

int CQRSOnLead::Heart_Rate(int* R_Peak_Pos)
{
	int i,j;
	int temp_RR_Interval[10];
	int heart_rate=0;

	if(R_Peak_Pos[0]<900)
	{
		for(j=0,i=0;i<20;i++)
		{	
			if((temp_RR_Interval[j]=R_Peak_Pos[i]-R_Peak_Pos[i+1])>0 && R_Peak_Pos[i]!=900)
			{
				heart_rate+=temp_RR_Interval[j];
				Single_RR_InterVal[j]=temp_RR_Interval[j];
			     j++;
			}
			if(j==6)
				break;
		}
	}
	else
	{
		for(j=0,i=0;i<20;i++)
		{	
			if((temp_RR_Interval[j]=R_Peak_Pos[i]-R_Peak_Pos[i+1])>=0)
			{heart_rate+=temp_RR_Interval[j];j++;}
			if(j==6)
				break;
		}
	}
// download by http:www.codesc.net
	if(heart_rate==0)
		return(0);
	else
	{
			return((SAMPLE_RATE*60)/(heart_rate/j));
	}
}

//88888888888888888
double CQRSOnLead::Heart_Rate8(int* R_Peak_Pos,int pos)
{
	int i,j;
	int temp_RR_Interval[10];
	int heart_rate=0;
	
	if(R_Peak_Pos[0]<900)
	{
		for(j=0,i=pos;i<20;i++)
		{	
			if((temp_RR_Interval[j]=R_Peak_Pos[i]-R_Peak_Pos[i+1])>0 && R_Peak_Pos[i]!=900)
			{
				heart_rate+=temp_RR_Interval[j];
				Single_RR_InterVal[j]=temp_RR_Interval[j];
			     j++;
			}
			if(j==8)
				break;
		}
	}
	else
	{
		for(j=0,i=pos;i<20;i++)
		{	
			if((temp_RR_Interval[j]=R_Peak_Pos[i]-R_Peak_Pos[i+1])>=0)
			{heart_rate+=temp_RR_Interval[j];j++;}
			if(j==8)
				break;
		}
	}

	if(heart_rate==0)
		return(0);
	else
		return(((double)heart_rate/SAMPLE_RATE)/8);
}

int CQRSOnLead::Accurate_R_Move(double* Move_Data, int R_Peak)
{
	int i,a;
	for(a=0,i=0;i<SAMPLE_RATE*0.1;i++)
		if(Move_Data[R_Peak+a]<Move_Data[R_Peak+i])
			a=i;
	return(R_Peak+a);
}

int CQRSOnLead::R_Peak_detection(int* R_Peak_Pos2,double* MOV_DATA,int segment_flag,double* Clean_Data)
{
	int i,k,m ;
	double MOV_DATA_COPY[SAMPLE_RATE*LENGTH];//复制3秒长的一段MOV_DATA_COPY数据
	int R_Peak_Pos[Max_Beat_Num];
	int Detected_Flag[Max_Beat_Num];//此标志标明某一RR间期是否超过1.5倍的平均RR间期,并是否已被
	                      //检测(在内部寻找QRS)1:已经寻找;0:没有寻找 
	int beat_num,beat_num2;
	double Ave_Ampl2;
    double Threshhold1=0.1;

	for(i=0;i<SAMPLE_RATE*LENGTH;i++)
		MOV_DATA_COPY[i]=MOV_DATA[i];

	for(i=0;i<Max_Beat_Num;i++)
		Detected_Flag[i]=0;
	//数据初始化
	if(segment_flag==0)
	{
	 for(i=0;i<Max_Beat_Num;i++)
	 {R_Peak_Pos[i]=0;}
	 for(i=0;i<Max_Beat_Num;i++)
	 {
		 R_Peak_Ampl[i]=Threshhold1;
		 RR_Interval[i]=(int)(SAMPLE_RATE*0.9);
	 }
	 Ave_Ampl=R_Peak_Ampl[0];
	 Ave_RR_Interval=RR_Interval[0];
	}	 
	//先以阈值0.08去粗选峰点(第一次)
	beat_num=0;
	R_Peak_Pos[0]=0;
//	Ave_Ampl2=0.2*Ave_Ampl;
	while(beat_num==0)
	{
		for(i=SAMPLE_RATE*0.3;i<SAMPLE_RATE*(LENGTH-0.1);i++)
		{
			if(MOV_DATA_COPY[i]>=0.5*Ave_Ampl)
			{
				if(MOV_DATA_COPY[i]>MOV_DATA_COPY[i-4])//确保该点出现在上升沿上
				{
				R_Peak_Position_Num[beat_num]=R_Peak_Pos[beat_num+1]=i=Accurate_R_Peak_Clean(Clean_Data,i);
			
				R_Peak_Pos_Data=Clean_Data[R_Peak_Pos[beat_num+1]]*2000;
 					i=i+0.3*SAMPLE_RATE;//跳过300ms,避免同一个QRS波被检测为R波多次
					beat_num++;	
				}
			}
		}
		if(beat_num==0)
		{
			Ave_Ampl*=0.9;
			if(Ave_Ampl<Threshhold2)//如果当平均幅度Ave_Ampl小于Threshhold2时,则说明没有
				                   //QRS波,推出循环,并在下一步推出程序
				break;
		}
	}
	//判断第一次粗选是否有峰点
	if(beat_num>19)//防止数组益出
	{
		for(i=0;i<Max_Beat_Num;i++)
			R_Peak_Pos2[i]=R_Peak_Pos[19-i];
		return(-1);
	}
	//没有的情况 
	if(beat_num==0)
	{
		for(i=0;i<7;i++)
			R_Peak_Pos2[i]=900;
		return(-2);
	}
	//有的情况
	//更新RR_Interval及Ave_RR_Interval
	for(i=Max_Beat_Num-(beat_num+1);i>=0;i--)
		RR_Interval[i+beat_num]=RR_Interval[i];
	for(i=0;i<beat_num;i++)
		RR_Interval[i]=R_Peak_Pos[i+1]-R_Peak_Pos[i];
	Ave_RR_Interval=0;
	for(i=0;i<Max_Beat_Num/2;i++)
		Ave_RR_Interval+=RR_Interval[i];
	Ave_RR_Interval/=Max_Beat_Num/2;
	//更新R_Peak_Ampl及Ave_Ampl
	for(i=Max_Beat_Num-beat_num-1;i>=0;i--)
		R_Peak_Ampl[i+beat_num]=R_Peak_Ampl[i];
	for(i=0;i<beat_num;i++)
		R_Peak_Ampl[i]=MOV_DATA_COPY[Accurate_R_Move(MOV_DATA_COPY,R_Peak_Pos[i+1])];//因为第一个QRS波位置为0
	                                                      
	Ave_Ampl=0;
	for(i=0;i<Max_Beat_Num/2;i++)
		Ave_Ampl+=R_Peak_Ampl[i];
	Ave_Ampl/=Max_Beat_Num/2;


	//suppose Ave_RR_Interval=50
	Ave_Ampl2=Ave_Ampl;
	for(i=0;i<beat_num;i++)
	{
		beat_num2=beat_num;
		if(R_Peak_Pos[i+1]-R_Peak_Pos[i]>1.5*Ave_RR_Interval && Detected_Flag[i]==0 
			&& beat_num<Max_Beat_Num-1)//怀疑漏检, 这里最后一个条件是为了防止心率过快
		{
			for(k=0;k<R_Peak_Pos[i+1]-R_Peak_Pos[i]-0.5*SAMPLE_RATE;k++)
			{
				if(MOV_DATA_COPY[R_Peak_Pos[i]+(int)(SAMPLE_RATE*0.3)+k]>=Ave_Ampl &&
					MOV_DATA_COPY[R_Peak_Pos[i]+(int)(SAMPLE_RATE*0.3)+k]>MOV_DATA_COPY[R_Peak_Pos[i]+(int)(SAMPLE_RATE*0.3)+k-80] &&//剔除P波
					MOV_DATA_COPY[R_Peak_Pos[i]+(int)(SAMPLE_RATE*0.3)+k]>MOV_DATA_COPY[R_Peak_Pos[i]+(int)(SAMPLE_RATE*0.3)+k-3])//确保在上升烟检测到一个QRS波
				{
					//插入一个R峰点
					for(m=Max_Beat_Num-2;m>=i+1;m--)
						R_Peak_Pos[m+1]=R_Peak_Pos[m];
					R_Peak_Pos[i+1]=Accurate_R_Peak_Clean(Clean_Data,R_Peak_Pos[i]+0.3*SAMPLE_RATE+k);

					//插入一个RR_Interval,and refresh the Ave_RR_Interval	
					for(m=Max_Beat_Num-2;m>=i+1;m--)
						RR_Interval[m+1]=RR_Interval[m];//leave one rooms
					RR_Interval[i]=R_Peak_Pos[i+1]-R_Peak_Pos[i];
					RR_Interval[i+1]=R_Peak_Pos[i+2]-R_Peak_Pos[i+1];
					Ave_RR_Interval=0;
					for(m=0;m<Max_Beat_Num/2;m++)
						Ave_RR_Interval+=RR_Interval[m];
					Ave_RR_Interval/=Max_Beat_Num/2;

					//插入一个Detected_Flag	
					for(m=Max_Beat_Num-2;m>i+1;m--)
						Detected_Flag[m+1]=Detected_Flag[m];//leave two rooms
					Detected_Flag[i]=0;
					Detected_Flag[i+1]=0;
					//插入一个R_Peak_Ampl,改变Ave_R_Peak_Ampl 
					for(m=Max_Beat_Num-2;m>=0;m--)
						R_Peak_Ampl[m+1]=R_Peak_Ampl[m];
					R_Peak_Ampl[0]=MOV_DATA_COPY[Accurate_R_Move(MOV_DATA_COPY,R_Peak_Pos[i+1])];
					for(m=0;m<Max_Beat_Num/2;m++)
						Ave_Ampl+=R_Peak_Ampl[m];
					Ave_Ampl/=Max_Beat_Num/2;
					Ave_Ampl2=Ave_Ampl;

					//改变i和j的values
					beat_num+=1;
					break;
				}
			}	
			if(beat_num!=beat_num2+1)//没有找到QRS
			{
				Ave_Ampl*=0.85;//调整此数,可以改变执行速度
				if(Ave_Ampl<2*Threshhold2)
				{Detected_Flag[i]=1;Ave_Ampl=Ave_Ampl2;continue;}//恢复Ave_Ampl,并跳出循环
				else//仍旧停留在同一RR间期上, 
				{i-=1;}

			}
			else
				i=-1;//从头开始
		}
	}
	for(i=Max_Beat_Num-(beat_num+2);i>=0;i--)//移动数组,留出空间	
		R_Peak_Pos2[i+beat_num+1]=R_Peak_Pos2[i];
	for(i=0;i<beat_num+1;i++)
	{
		R_Peak_Pos2[beat_num-i]=R_Peak_Pos[i];
	//	printf("the R peaks are:     R_Peak_Pos[%d]=%d\n",i,R_Peak_Pos[i]);
	}
	return(beat_num);
}

int CQRSOnLead::Accurate_R_Peak_Clean(double* Clean_Data, int R_Peak)
{
	int i,j;
	int a;
	int Max_Peak,Min_Peak,Max_Slope_Peak;
	double tempdata[int(0.15*SAMPLE_RATE)];
	int temppeak[10];
	double peakslope[10],Max_Slope,Slope_Max,Slope_Min;

	Max_Peak=Min_Peak=R_Peak;
	for(i=0;i<10;i++)
		temppeak[i]=R_Peak;
	//取R_Peak两边数据段
	for(i=0;i<0.15*SAMPLE_RATE;i++)
		tempdata[i]=Clean_Data[R_Peak+i-int(0.075*SAMPLE_RATE)];
	//找出该数据段中的所有峰点
	for(j=0,i=0;i<0.15*SAMPLE_RATE-10;i++)
		if((tempdata[i+5]-tempdata[i])*(tempdata[i+5]-tempdata[i+10])>=0)
		{
			temppeak[j]=R_Peak+i+5-0.075*SAMPLE_RATE;
			peakslope[j]=(tempdata[i+5]-tempdata[i])*(tempdata[i+5]-tempdata[i+10]);
			j++;
			i+=5;
			if(j==10)
				break;
		}

	//找出所有峰点中对应原始信号的幅度的最大和最小值
	for(a=0,i=0;i<j;i++)
		if(Clean_Data[temppeak[a]]<Clean_Data[temppeak[i]])
			a=i;
	Max_Peak=temppeak[a];
	Slope_Max=peakslope[a];

	for(a=0,i=0;i<j;i++)
		if(Clean_Data[temppeak[a]]>Clean_Data[temppeak[i]])
			a=i;
	Min_Peak=temppeak[a];
	Slope_Min=peakslope[a];
	//找出所有峰点中,斜率最大值
	for(a=0,i=0;i<j;i++)
		if(peakslope[a]<peakslope[i])
			a=i;
	Max_Slope=peakslope[a];
	Max_Slope_Peak=temppeak[a];
	//最终确定峰点,如果负向峰点幅度大于正向峰点幅度2倍,则认为负向峰点为R峰点
	if(Clean_Data[Min_Peak]<0 && Slope_Min>0.5*Max_Slope)
		return(Min_Peak);
	if(Clean_Data[Min_Peak]<0 && fabs(Clean_Data[Min_Peak])<=fabs(Clean_Data[Max_Peak])
													&& Slope_Max>0.5*Max_Slope)
		return(Max_Peak);
	return(Max_Slope_Peak);
}

//计算QS间期

 int CQRSOnLead::Accurate_Q_S_Interval(double * Clean_Data, int R_Peak_Pos_Num)
{

   int Clean_Data_Temp_Max_Pos=0;
   double Clean_Data_Temp[75],Clean_Data_Temp_Max=0.0;
   memset(Clean_Data_Temp,0,75*8);
   for (int i=0;i<0.25*SAMPLE_RATE;i++)
   {
	   if ((R_Peak_Pos_Num-int(0.125*SAMPLE_RATE)+i)<0||(R_Peak_Pos_Num-int(0.125*SAMPLE_RATE)+i)>900)
	   {
		   return 100;
	   }
	   
	   Clean_Data_Temp[i]=Clean_Data[R_Peak_Pos_Num-int(0.125*SAMPLE_RATE)+i];
   }

   for (i=0;i<0.25*SAMPLE_RATE;i++)
   { 
	   if (Clean_Data_Temp[i]>Clean_Data_Temp_Max) 
	   {
		   Clean_Data_Temp_Max=Clean_Data_Temp[i];
		   Clean_Data_Temp_Max_Pos=i;
		   
	   }
   }

	for (i=Clean_Data_Temp_Max_Pos;i>0;i--)
	{
		Clean_Data_Temp[i]=Clean_Data_Temp[i]-Clean_Data_Temp[i-1];
		if (Clean_Data_Temp[i]<0) 
		{
			Q_Pos=i;

			break;
		}
	}

	for (i=Clean_Data_Temp_Max_Pos+1;i<73;i++)
	{
        Clean_Data_Temp[i]=Clean_Data_Temp[i+2]-Clean_Data_Temp[i+1];
		if (Clean_Data_Temp[i]>0)
		{
			S_Pos=i+1;
			break;
		}
	}
       QS_Interval=(S_Pos-Q_Pos)*1000/300;
     return (QS_Interval);
}
////////////////

int CQRSOnLead::HeartRate_Output(double* ECG_Data,int Segment_Flag)
{
	int i,beat_num;
	double Wavelet_Cof[SAMPLE_RATE*LENGTH],Square_Data[SAMPLE_RATE*LENGTH];
	double Move_Data[SAMPLE_RATE*LENGTH],Clean_Data[SAMPLE_RATE*LENGTH];
	for(i=0;i<SAMPLE_RATE*LENGTH;i++)
		Clean_Data[i]=low_pass(ECG_Data[i]);
	
		Wavelet_Trans(Wavelet_Cof,Clean_Data);
		
		for(i=0;i<SAMPLE_RATE*LENGTH;i++)
			Square_Data[i]=pow(Wavelet_Cof[i],2);
		
		Move_Window(Square_Data,Move_Data);

		beat_num=R_Peak_detection(R_Peak,Move_Data,Segment_Flag,Clean_Data);
		HeartRate=Heart_Rate(R_Peak);
        //QS_Interval=Accurate_Q_S_Interval(Clean_Data,R_Peak);
        Alarm=HeartRateAbnormalAlarm(Clean_Data);
		return(HeartRate);
}

//int CQRSOnLead::HeartRateAbnormalAlarm(double *Clean_Data)
//{
//
//	for (int i=0;R_Peak[i]!=0;i++)
//	{   
//		if(R_Peak[i+1]!=0)
//		{
//			m_HAlarm[i].RRt0=(double)(R_Peak[i+1]-R_Peak[i+2])/SAMPLE_RATE;
//		}
//		else
//		{
//			m_HAlarm[i].RRt0=(double)(R_Peak[i+2]-R_Peak[i+3])/SAMPLE_RATE;
//		}
//		m_HAlarm[i].RRt=(double)(R_Peak[i]-R_Peak[i+1])/SAMPLE_RATE;
//		if(i>0) m_HAlarm[i].RRt1=(double)(R_Peak[i-1]-R_Peak[i])/SAMPLE_RATE;
//		else m_HAlarm[i].RRt1=m_HAlarm[i].RRt;
//		m_HAlarm[i].ARt=Heart_Rate8(R_Peak,i);
//		m_HAlarm[i].ARt0=Heart_Rate8(R_Peak,i+1);
//		m_HAlarm[i].ARt00=Heart_Rate8(R_Peak,i+2);		
//		m_HAlarm[i].ThreeSeconds_No_RPeack=FALSE;
////		m_HAlarm[i].WW=Accurate_Q_S_Interval(Clean_Data,R_Peak[i]);//ms
//	//////////////////////////////////////////////////////////////////////////
//		if (m_HAlarm[i].RRt>1.5&&m_HAlarm[i].ARt>1.2)
//	    {
//			return TRUE;			
//	    }	
//		if(m_HAlarm[i].ARt!=0)
//		{	if ((m_HAlarm[i].ARt)<0.5)
//			{
//				return TRUE;				
//			}
//		
//			if ((m_HAlarm[i].RRt)>1.9*(m_HAlarm[i].ARt0))
//			{
//				return TRUE;			
//			}			
//			if ((m_HAlarm[i].RRt)<0.75*(m_HAlarm[i].ARt)&&
//			//	m_HAlarm[i].WW>120&&
//				((m_HAlarm[i].RRt)+(m_HAlarm[i].RRt1))>=2*(m_HAlarm[i].ARt))
//			{
//				return TRUE;				
//			}
//			if ((m_HAlarm[i].RRt)<0.75*(m_HAlarm[i].ARt)&&
//			//	m_HAlarm[i].WW<120&&
//				((m_HAlarm[i].RRt)+(m_HAlarm[i].RRt1))<2*(m_HAlarm[i].ARt))
//			{
//				return TRUE;				
//			}
//			if ((m_HAlarm[i].RRt)<0.7*(m_HAlarm[i].ARt)&&
//			//	m_HAlarm[i].WW>120&&
//				((m_HAlarm[i].RRt)+(m_HAlarm[i].RRt1))<=1.1*(m_HAlarm[i].ARt)
//				&&((m_HAlarm[i].RRt)+(m_HAlarm[i].RRt1))>=0.7*(m_HAlarm[i].ARt))
//			{
//				return TRUE;				
//			}
//			if (m_HAlarm[i].RRt<0.33*m_HAlarm[i].ARt&&
//				((m_HAlarm[i].RRt)+(m_HAlarm[i].RRt1))<=1.1*(m_HAlarm[i].ARt)
//				&&((m_HAlarm[i].RRt)+(m_HAlarm[i].RRt1))>=0.9*(m_HAlarm[i].ARt))
//			{
//				return TRUE;
//			}
//
//		}
////		if (m_HAlarm[i].WW>120)
////		{
////			return TRUE;
////			
////		}
//		
//	}	 
//  return FALSE;	
//}
int CQRSOnLead::HeartRateAbnormalAlarm(double *Clean_Data)
{

	for (int i=0;i<6;i++)
	{   
		if(i<5)
		{
			m_HAlarm[i].RRt0=(double)(Single_RR_InterVal[i+1])/SAMPLE_RATE;
		}
		else
		{
			m_HAlarm[i].RRt0=(double)(Single_RR_InterVal[i])/SAMPLE_RATE;
		}
		m_HAlarm[i].RRt=(double)(Single_RR_InterVal[i])/SAMPLE_RATE;
		if(i>0) m_HAlarm[i].RRt1=(double)(Single_RR_InterVal[i-1])/SAMPLE_RATE;
		else m_HAlarm[i].RRt1=m_HAlarm[i].RRt;
		m_HAlarm[i].ARt=Heart_Rate8(R_Peak,i);
		m_HAlarm[i].ARt0=Heart_Rate8(R_Peak,i+1);
		m_HAlarm[i].ARt00=Heart_Rate8(R_Peak,i+2);		
		m_HAlarm[i].ThreeSeconds_No_RPeack=FALSE;
//		m_HAlarm[i].WW=Accurate_Q_S_Interval(Clean_Data,R_Peak[i]);//ms
	//////////////////////////////////////////////////////////////////////////
		if (m_HAlarm[i].RRt>1.5&&m_HAlarm[i].ARt>1.2)
	    {
			return TRUE;			
	    }	
		if(m_HAlarm[i].ARt!=0)
		{	if ((m_HAlarm[i].ARt)<0.5)
			{
				return TRUE;				
			}
		
			if ((m_HAlarm[i].RRt)>1.9*(m_HAlarm[i].ARt0))
			{
				return TRUE;			
			}	
			//0.89 参数 可调 标准 参数为0.75
			if ((m_HAlarm[i].RRt)<0.89*(m_HAlarm[i].ARt)&&
			//	m_HAlarm[i].WW>120&&
				((m_HAlarm[i].RRt)+(m_HAlarm[i].RRt1))>=2*(m_HAlarm[i].ARt))
			{
				return TRUE;				
			}
			if ((m_HAlarm[i].RRt)<0.89*(m_HAlarm[i].ARt)&&
			//	m_HAlarm[i].WW<120&&
				((m_HAlarm[i].RRt)+(m_HAlarm[i].RRt1))<2*(m_HAlarm[i].ARt))
			{
				return TRUE;				
			}
			if ((m_HAlarm[i].RRt)<0.7*(m_HAlarm[i].ARt)&&
			//	m_HAlarm[i].WW>120&&
				((m_HAlarm[i].RRt)+(m_HAlarm[i].RRt1))<=1.1*(m_HAlarm[i].ARt)
				&&((m_HAlarm[i].RRt)+(m_HAlarm[i].RRt1))>=0.7*(m_HAlarm[i].ARt))
			{
				return TRUE;				
			}
			if (m_HAlarm[i].RRt<0.33*m_HAlarm[i].ARt&&
				((m_HAlarm[i].RRt)+(m_HAlarm[i].RRt1))<=1.1*(m_HAlarm[i].ARt)
				&&((m_HAlarm[i].RRt)+(m_HAlarm[i].RRt1))>=0.9*(m_HAlarm[i].ARt))
			{
				return TRUE;
			}

		}
//		if (m_HAlarm[i].WW>120)
//		{
//			return TRUE;
//			
//		}
		
	}	 
  return FALSE;	
}